iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
1

上一章我們用detector人臉偵測器和圖片分割的方式做出了大頭照攝影程式,本章我們來玩點比較進階的動態人臉捕捉程式吧。

import dlib
import cv2
import imutils

和上一章的步驟一樣,我們先將攝像頭和人臉偵測器先設定好:

cap = cv2.VideoCapture(0)

detector = dlib.get_frontal_face_detector()

接下來和之前不一樣,因為我們需要一直開啟攝像頭來進行動態辨識,所以我們要用迴圈將程式主體包起來:

while(cap.isOpened()):

然後用cap.readdetector.run兩個函式進行人臉捕捉:

  ret, frame = cap.read()

  face_rects, scores, idx = detector.run(frame, 0)

可以看到detector.run完之後多了兩個變數,這是這個函式本身就提供的辨識資料,其中scores代表辨識分數,分數越高則人臉辨識的精確率越高,而idx代表臉部方向,可能被辨識為正臉、面向左邊、面向右邊、面向上方、面向下方等。把這兩個變數取出來有助於我們對結果的理解,下面我們會對這兩個變數進行加工。

  for i, d in enumerate(face_rects):
      x1 = d.left()
      y1 = d.top()
      x2 = d.right()
      y2 = d.bottom()
      text = "%2.2f(%d)" % (scores[i], idx[i])

和上章有些不同的是,我們需要將辨識分數和人臉方向顯示在畫面上,所以我們把scoresidx的資料帶入text變數。

  cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 4, cv2.LINE_AA)

  cv2.putText(frame, text, (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1, cv2.LINE_AA)

這裡我們用之前說過的cv2.rectangle函式畫出矩形,將辨識到的臉部標示出來,然後用cv2.putText在矩形上方繪出text變數的內容,這兩個東西會隨著frame變動位置。

上面就是程式的主要部份了,迴圈尾端記得設置break條件,不然程式會跳不出去:

  cv2.imshow("FaceShow", frame)

  if cv2.waitKey(1) & 0xFF == ord('q'):
    break

# 迴圈結束

cap.release()
cv2.destroyAllWindows()

試著執行看看吧!


上一篇
Day23-大頭照拍攝
下一篇
Day25-遺照(?)拍攝
系列文
OpenCV 從零開始的影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言